package com.ruoyi.common.utils;

import cn.hutool.json.JSONObject;
import com.ruoyi.common.exception.ServiceException;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class InterlaceUtils {

    /**
     * 将对象中的属性参数按照Key的字母顺序重新排列并转成 key=value&key1=value的格式
     *
     * @param obj 对象
     * @return 排序后的字符串
     * @throws IllegalAccessException 如果无法访问对象的属性
     */
    public static String sortAndEncodeParams(Object obj) {
        if (obj == null) {
            return null;
        }
        Map<String, String> params = new HashMap<>();

        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 确保可以访问私有字段
            Object value = null;
            try {
                value = field.get(obj);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                throw new ServiceException("无法访问对象的属性");
            }
            if (value != null) {
                params.put(field.getName(), String.valueOf(value));
            }
        }
        // 使用TreeMap来自动排序键
        TreeMap<String, String> sortedParams = new TreeMap<>(params);
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
            if (sb.length() > 0) {
                sb.append("&");
            }
            sb.append(entry.getKey()).append("=").append(entry.getValue());
        }
        return sb.toString();
    }

    /**
     * 将对象转换为JSON格式的字符串
     *
     * @param obj
     * @return
     */
    public static String convertObjectToJson(Object obj) {
        if (obj == null) {
            return "";
        }
        // 创建一个Map来存储对象的属性和属性值
        Map<String, Object> map = new HashMap<>();
        // 获取对象的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);  // 设置字段可访问
            try {
                Object value = field.get(obj);
                // 过滤掉null值
                if (value != null && !"".equals(value.toString())) {
                    map.put(field.getName(), value);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 使用JSONObject将Map转换为JSON字符串
        JSONObject jsonObject = new JSONObject(map);
        return jsonObject.toString();
    }

    /**
     * 通用路径参数替换方法
     * @param url        URL模板，包含占位符，如 /path/{id}/subpath
     * @param pathParams 路径参数映射
     * @return 替换占位符后的URL
     */
    public static String replacePathParameters(String url, Map<String, String> pathParams) {
        if (pathParams == null || pathParams.isEmpty()) {
            return url;
        }
        String result = url;
        for (Map.Entry<String, String> entry : pathParams.entrySet()) {
            String placeholder = "{" + entry.getKey() + "}";
            result = result.replace(placeholder, entry.getValue());
        }
        return result;
    }
}
